package logger

import (
	"log/slog"
	"os"
)

type RlogAdapter struct {
}

func NewRLog() *RlogAdapter {
	return &RlogAdapter{}
}

func (l *RlogAdapter) Debug(msg string, fields map[string]interface{}) {
	if msg == "" && len(fields) == 0 {
		return
	}
	slog.Debug(msg, map2Args(fields)...)
}

func (l *RlogAdapter) Info(msg string, fields map[string]interface{}) {
	if msg == "" && len(fields) == 0 {
		return
	}
	slog.Info(msg, map2Args(fields)...)
}

func (l *RlogAdapter) Warning(msg string, fields map[string]interface{}) {
	if msg == "" && len(fields) == 0 {
		return
	}
	slog.Warn(msg, map2Args(fields)...)
}

func (l *RlogAdapter) Error(msg string, fields map[string]interface{}) {
	if msg == "" && len(fields) == 0 {
		return
	}
	slog.Error(msg, map2Args(fields)...)
}

func (l *RlogAdapter) Fatal(msg string, fields map[string]interface{}) {
	if msg == "" && len(fields) == 0 {
		return
	}
	slog.Error(msg, map2Args(fields)...)
	os.Exit(1)
}

func (l *RlogAdapter) Level(level string) {
	SetLevel(level)
}

func (l *RlogAdapter) OutputPath(path string) (err error) {
	SetOutputFile(path)
	return nil
}

func map2Args(fields map[string]interface{}) []any {
	var args = make([]interface{}, 0, len(fields)*2)
	for k, v := range fields {
		args = append(args, k, v)
	}

	return args
}
